1. Data Management
The data has been extracted for 2020 year to include the democratic and Republican Parties. The total votes per county by each of the winner is calculated and is shown in the PercentVotes column.We are also calculating the Winner for each of the county. We see that in 508 counties the winner party was Democrat . However Republican was winner in 2566 counties.
Create an interactive choropleth map to display the presidential election results at county level using two different colors to represent the two parties. You can choose any R library to accomplish this part of the assignment.
#library(plotly)
#library(plotly)
#library(rjson)
#library("RColorBrewer") # brewer.pal.info for list of color scales
url <- "https://github.com/pengdsci/sta553/raw/main/data/geojson-counties-fips.json" # contains geocode to define county boundaries in the choropleth map
counties <- rjson::fromJSON(file=url)
# geo styling
g <- list( scope = 'usa',
projection = list(type = 'albers usa'),
showland = TRUE,
landcolor="white",
countrywidth = 0.5,
subunitwidth = 0.5
)
###
fig <- plot_geo(df, lat = ~lat, lon = ~lon) %>%
add_markers( text = ~paste(county_name, winner,
paste("Winner:", winner),
sep = "<br>"),
color=~winner,
symbol = "circle",
size = ~percentvotes ,
colorscale = "RnBu",
hoverinfo = "text") %>%
colorbar(title = "Parties") %>%
layout( title = '2020 Presidential election Results',
geo = g )
fig
#library(plotly)
#library(rjson)
#library("RColorBrewer") # brewer.pal.info for list of color scales
Another representation using Choropleth Map:
`summarise()` has grouped output by 'state_po'. You can override using the `.groups` argument.
fig <- plot_ly() %>%
add_trace( type = "choropleth",
geojson = counties,
locations = df$county_fips,
z = df$percentvotes,
colorscale = "TealGrn",
zmin = 0,
zmax = 100,
text = ~paste("<br>County: ", df$county_name,
"<br>Party won: ", df$winner,
"<br>Winner votes percent: ", df$percentvotes,
"<br>Total votes: ", df$totalvotes,
"<br>State: ", df$state_po),
hoverinfo = "text",
marker = list(line=list(width=0.3))) %>%
colorbar(title = "Winner Votes percent(%)") %>%
layout( title = list(text = "<b>US Presidential elections 2020 by County</b>",
font = list(size = 20,
color = "darkred")),
margin = list( b = 15, l = 25, t = 85, r = 25),
geo = g)
fig
An interesting thing to note is that this view is even more heavily dominated by the Republican. Less densely populated counties tend to vote republican, while higher density, typically smaller counties tend to vote for democrats. The result is interesting because overall the winner was Democrat Party.
Using Tableau to create the map
The link for the visualization created in Tableau public is: click here
LS0tDQp0aXRsZTogIkhXNCINCmF1dGhvcjogIlJhc2htaSBLYWxyYSINCg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiBkZWZhdWx0DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQplZGl0b3Jfb3B0aW9uczoNCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KDQpkaXYjVE9DIGxpIHsNCiAgICBsaXN0LXN0eWxlOm5vbmU7DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KfQ0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMnB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgyIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICBmb250LWZhY2U6IGJvbGQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KLyogVGFiIGZlYXR1cmVzICovDQoubmF2PmxpPmEgew0KICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgICBkaXNwbGF5OiBibG9jazsNCiAgICBwYWRkaW5nOiAxMHB4IDE1cHg7DQogICAgY29sb3I6ICM5OTAwMDA7DQp9DQoubmF2LXBpbGxzPmxpLmFjdGl2ZT5hLCAubmF2LXBpbGxzPmxpLmFjdGl2ZT5hOmhvdmVyLCAubmF2LXBpbGxzPmxpLmFjdGl2ZT5hOmZvY3VzIHsNCiAgICBjb2xvcjogI2ZmZmZmZjsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTkwMDAwOw0KfQ0KLyogY2VudGVyIG1hcHMgdXNpbmcgY2h1bmsgb3B0aW9uOiBmaWcuYWxpZ249J2NlbnRlcicgKi8NCi5odG1sLXdpZGdldCB7DQogICAgbWFyZ2luOiBhdXRvOw0KfQ0KPC9zdHlsZT4NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogICBsaWJyYXJ5KHBsb3RseSkNCn0NCmlmICghcmVxdWlyZSgiZ2FwbWluZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImdhcG1pbmRlciIpDQogICBsaWJyYXJ5KGdhcG1pbmRlcikNCn0NCmlmICghcmVxdWlyZSgiUkN1cmwiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIlJDdXJsIikgICAgICAgICAgICAgIyBJbnN0YWxsIFJDdXJsIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJSQ3VybCIpDQp9DQppZiAoIXJlcXVpcmUoImNvbG91cnBpY2tlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiY29sb3VycGlja2VyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImNvbG91cnBpY2tlciIpDQp9DQppZiAoIXJlcXVpcmUoImdnYW5pbWF0ZSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dhbmltYXRlIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdnYW5pbWF0ZSIpDQp9DQppZiAoIXJlcXVpcmUoImdpZnNraSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2lmc2tpIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdpZnNraSIpDQp9DQppZiAoIXJlcXVpcmUoIm1hZ2ljayIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIm1hZ2ljayIpDQp9DQppZiAoIXJlcXVpcmUoImdyRGV2aWNlcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ3JEZXZpY2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdyRGV2aWNlcyIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZsZXQiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImxlYWZsZXQiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZmxldCIpDQp9DQppZiAoIXJlcXVpcmUoIm1hcHMiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIm1hcHMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibWFwcyIpDQp9DQppZiAoIXJlcXVpcmUoImh0bWx0b29scyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiaHRtbHRvb2xzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImh0bWx0b29scyIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZsZWdlbmQiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImxlYWZsZWdlbmQiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZmxlZ2VuZCIpDQp9DQppZiAoIXJlcXVpcmUoImdlb2pzb25pbyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2VvanNvbmlvIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdlb2pzb25pbyIpDQp9DQppZiAoIXJlcXVpcmUoInJnZGFsIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJyZ2RhbCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJyZ2RhbCIpDQp9DQppZiAoIXJlcXVpcmUoInN0cmluZ2kiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInN0cmluZ2kiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgic3RyaW5naSIpDQp9DQppZiAoIXJlcXVpcmUoIlJDb2xvckJyZXdlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIlJDb2xvckJyZXdlciIpDQp9DQppZiAoIXJlcXVpcmUoInRpZ3JpcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygidGlncmlzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInRpZ3JpcyIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZwb3AiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImxlYWZwb3AiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibGVhZnBvcCIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZlbSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmVtIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImxlYWZlbSIpDQp9DQppZiAoIXJlcXVpcmUoInRtYXAiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInRtYXAiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgidG1hcCIpDQp9DQppZiAoIXJlcXVpcmUoInRtYXB0b29scyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygidG1hcHRvb2xzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInRtYXB0b29scyIpDQp9DQppZiAoIXJlcXVpcmUoInJlYWR4bCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygicmVhZHhsIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInJlYWR4bCIpDQp9DQojIGtuaXRyOjpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gIkM6L1VzZXJzLzc1Q1BFTkcvT25lRHJpdmUgLSBXZXN0IENoZXN0ZXIgVW5pdmVyc2l0eSBvZiBQQS9Eb2N1bWVudHMiKQ0KIyBrbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICJDOlxcU1RBNDkwXFx3MDUiDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUUlVFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSkNCmBgYA0KDQojIDEuIERhdGEgTWFuYWdlbWVudA0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KDQojIFJlYWRpbmcgRGF0YXNldHMNCmVsZWN0aW9uPC1yZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JrMjk5MS9zdGE1NTMvbWFpbi9kYXRhL2NvdW50eXByZXNpZGVudGlhbF9lbGVjdGlvbl8yMDAwLTIwMjAuY3N2IikNCmZpcHM8LXJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmsyOTkxL3N0YTU1My9tYWluL2RhdGEvZmlwczJnZW9jb2RlLmNzdiIpDQoNCiNFeHRyYWN0IG9uIDIwMjAgcHJlc2lkZW50aWFsIGVsZWN0aW9uIGRhdGE6IHllYXINCmVsZWN0aW9uMjAyMDwtZmlsdGVyKGVsZWN0aW9uLCB5ZWFyPT0yMDIwKQ0KDQoNCiNPbmx5IGluY2x1ZGUgRGVtb2NyYXRzIGFuZCBSZXB1YmxpY2FuIHZvdGVzOiBwYXJ0eQ0KZWxlY3Rpb24yMDIwPC1maWx0ZXIoZWxlY3Rpb24yMDIwLCBwYXJ0eT09IkRFTU9DUkFUIiB8cGFydHk9PSJSRVBVQkxJQ0FOIiApDQpuYW1lcyhlbGVjdGlvbjIwMjApW25hbWVzKGVsZWN0aW9uMjAyMCkgPT0gImNvdW50eV9maXBzIl0gPC0gImZpcHMiDQoNCiNJbmNsdWRlIHZhcmlhYmxlczogc3RhdGVfcG8sIGNvdW50eV9uYW1lLCBjb3VudHlfZmlwcywgcGFydHksIGNhbmRpZGF0ZXZvdGVzDQplbGVjdGlvbjIwMjA8LXNlbGVjdChlbGVjdGlvbjIwMjAsc3RhdGVfcG8sIGNvdW50eV9uYW1lLCBmaXBzLCBwYXJ0eSwgY2FuZGlkYXRldm90ZXMsIHRvdGFsdm90ZXMpDQoNCiMgVG8gZmluZCB0aGUgd2lubmVyLCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgcGVyY2VudCB2b3RlcyBmb3IgZWFjaCBjb3VudHkNCmRlbW92b3Rlc19wZXJjb3VudHkgPC0gZWxlY3Rpb24yMDIwICU+JQ0KICAgZmlsdGVyKHBhcnR5ID09IkRFTU9DUkFUIikgJT4lDQogICAgICAgICAgICAgZ3JvdXBfYnkoZmlwcykgJT4lDQogICAgICAgICAgICAgc3VtbWFyaXplKGRlbW92b3RlcyA9IHN1bShjYW5kaWRhdGV2b3RlcykNCg0KICAgICAgICAgICAgICAgICAgICAgICApDQpyZXBvdm90ZXNfcGVyY291bnR5IDwtIGVsZWN0aW9uMjAyMCAlPiUNCiAgIGZpbHRlcihwYXJ0eSA9PSJSRVBVQkxJQ0FOIikgJT4lDQogICAgICAgICAgICAgZ3JvdXBfYnkoZmlwcykgJT4lDQogICAgICAgICAgICAgc3VtbWFyaXplKHJlcHZvdGVzID0gc3VtKGNhbmRpZGF0ZXZvdGVzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgDQphID0gbGVmdF9qb2luKGVsZWN0aW9uMjAyMCwgZGVtb3ZvdGVzX3BlcmNvdW50eSwgYnkgPSAiZmlwcyIpDQpiPSBsZWZ0X2pvaW4oYSwgcmVwb3ZvdGVzX3BlcmNvdW50eSwgYnkgPSAiZmlwcyIpDQoNCg0KYiR3aW5uZXI9YXMuZmFjdG9yKGlmZWxzZShiJGRlbW92b3RlcyA+YiRyZXB2b3RlcywiREVNT0NSQVQiLCJSRVBVQkxJQ0FOIikpDQoNCmIkcGVyY2VudHZvdGVzPWlmZWxzZShiJHdpbm5lcj09IkRFTU9DUkFUIiAsKGIkZGVtb3ZvdGVzL2IkdG90YWx2b3RlcykqMTAwLCAoYiRyZXB2b3Rlcy9iJHRvdGFsdm90ZXMpKjEwMCkNCiAgIA0KYjwtc2VsZWN0KGIsc3RhdGVfcG8sIGNvdW50eV9uYW1lLCBmaXBzLGRlbW92b3RlcyAscmVwdm90ZXMgLCAgICB3aW5uZXIgLHRvdGFsdm90ZXMgLCBwZXJjZW50dm90ZXMpDQpiPC11bmlxdWUoYikNCg0KI01lcmdlIHRoZSBhYm92ZSBkYXRhIHdpdGggRklQUyB0byBHZW9jb2RlIERhdGF1c2luZyB0aGUgRklQUyBhcyB0aGUgcHJpbWFyeSBrZXkuDQoNCmRmID0gbWVyZ2UoeD1iLCBmaXBzLCBieT0nZmlwcycsIGFsbCA9IEZBTFNFKQ0KDQpoZWFkKGRmKQ0Kd3JpdGUuY3N2KGRmLCBmaWxlPSJDOi9Vc2Vycy9zYWdhci9PbmVEcml2ZS9EZXNrdG9wL3N0YTU1My9IT01FV09SS1MvdGVzdC5jc3YiKQ0KYGBgDQoNClRoZSBkYXRhIGhhcyBiZWVuIGV4dHJhY3RlZCBmb3IgMjAyMCB5ZWFyIHRvIGluY2x1ZGUgdGhlIGRlbW9jcmF0aWMgYW5kIFJlcHVibGljYW4gUGFydGllcy4gVGhlIHRvdGFsIHZvdGVzIHBlciBjb3VudHkgYnkgZWFjaCBvZiB0aGUgd2lubmVyIGlzIGNhbGN1bGF0ZWQgYW5kIGlzIHNob3duIGluIHRoZSBQZXJjZW50Vm90ZXMgY29sdW1uLldlIGFyZSBhbHNvIGNhbGN1bGF0aW5nIHRoZSBXaW5uZXIgZm9yIGVhY2ggb2YgdGhlIGNvdW50eS4gV2Ugc2VlIHRoYXQgaW4gNTA4IGNvdW50aWVzIHRoZSB3aW5uZXIgcGFydHkgd2FzIERlbW9jcmF0IC4gSG93ZXZlciBSZXB1YmxpY2FuIHdhcyB3aW5uZXIgaW4gMjU2NiBjb3VudGllcy4NCg0KIyBDcmVhdGUgYW4gaW50ZXJhY3RpdmUgY2hvcm9wbGV0aCBtYXAgdG8gZGlzcGxheSB0aGUgcHJlc2lkZW50aWFsIGVsZWN0aW9uIHJlc3VsdHMgYXQgY291bnR5IGxldmVsIHVzaW5nIHR3byBkaWZmZXJlbnQgY29sb3JzIHRvIHJlcHJlc2VudCB0aGUgdHdvIHBhcnRpZXMuIFlvdSBjYW4gY2hvb3NlIGFueSBSIGxpYnJhcnkgdG8gYWNjb21wbGlzaCB0aGlzIHBhcnQgb2YgdGhlIGFzc2lnbm1lbnQuDQoNCg0KYGBge3J9DQojbGlicmFyeShwbG90bHkpDQojbGlicmFyeShwbG90bHkpDQojbGlicmFyeShyanNvbikNCiNsaWJyYXJ5KCJSQ29sb3JCcmV3ZXIiKSAgIyBicmV3ZXIucGFsLmluZm8gZm9yIGxpc3Qgb2YgY29sb3Igc2NhbGVzDQoNCnVybCA8LSAiaHR0cHM6Ly9naXRodWIuY29tL3Blbmdkc2NpL3N0YTU1My9yYXcvbWFpbi9kYXRhL2dlb2pzb24tY291bnRpZXMtZmlwcy5qc29uIiAgIyBjb250YWlucyBnZW9jb2RlIHRvIGRlZmluZSBjb3VudHkgYm91bmRhcmllcyBpbiB0aGUgY2hvcm9wbGV0aCBtYXANCmNvdW50aWVzIDwtIHJqc29uOjpmcm9tSlNPTihmaWxlPXVybCkgIA0KDQojIGdlbyBzdHlsaW5nDQpnIDwtIGxpc3QoICAgICAgc2NvcGUgPSAndXNhJywNCiAgICAgICAgICAgcHJvamVjdGlvbiA9IGxpc3QodHlwZSA9ICdhbGJlcnMgdXNhJyksDQogICAgICAgICAgICAgc2hvd2xhbmQgPSBUUlVFLA0KIGxhbmRjb2xvcj0id2hpdGUiLA0KICAgY291bnRyeXdpZHRoID0gMC41LA0KICAgICAgICAgc3VidW5pdHdpZHRoID0gMC41DQogICAgICANCiAgICAgICApDQojIyMNCmZpZyA8LSBwbG90X2dlbyhkZiwgbGF0ID0gfmxhdCwgbG9uID0gfmxvbikgJT4lIA0KICBhZGRfbWFya2VycyggdGV4dCA9IH5wYXN0ZShjb3VudHlfbmFtZSwgd2lubmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZSgiV2lubmVyOiIsIHdpbm5lciksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiPGJyPiIpLA0KICAgICAgICAgICAgY29sb3I9fndpbm5lciwNCiAgICAgICAgICAgICAgc3ltYm9sID0gImNpcmNsZSIsIA0KICAgICAgICAgICAgICBzaXplID0gfnBlcmNlbnR2b3RlcyAsIA0KICAgICAgICAgICAgIGNvbG9yc2NhbGUgPSAiUm5CdSIsICANCiAgICAgICAgICAgICAgaG92ZXJpbmZvID0gInRleHQiKSAgICU+JSANCiAgY29sb3JiYXIodGl0bGUgPSAiUGFydGllcyIpICAlPiUgDQogIGxheW91dCggdGl0bGUgPSAnMjAyMCBQcmVzaWRlbnRpYWwgZWxlY3Rpb24gUmVzdWx0cycsIA0KICAgICAgICAgIGdlbyA9IGcgKQ0KICAgICAgICAgIA0KZmlnDQoNCg0KI2xpYnJhcnkocGxvdGx5KQ0KI2xpYnJhcnkocmpzb24pDQojbGlicmFyeSgiUkNvbG9yQnJld2VyIikgICMgYnJld2VyLnBhbC5pbmZvIGZvciBsaXN0IG9mIGNvbG9yIHNjYWxlcw0KDQpgYGANCg0KIyBBbm90aGVyIHJlcHJlc2VudGF0aW9uIHVzaW5nIENob3JvcGxldGggTWFwOiANCg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KDQplbGVjdGlvbjwtcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yazI5OTEvc3RhNTUzL21haW4vZGF0YS9jb3VudHlwcmVzaWRlbnRpYWxfZWxlY3Rpb25fMjAwMC0yMDIwLmNzdiIpDQpmaXBzPC1yZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JrMjk5MS9zdGE1NTMvbWFpbi9kYXRhL2ZpcHMyZ2VvY29kZS5jc3YiKQ0KDQplbGVjdGlvbjIwMjAgPC0gZWxlY3Rpb24gJT4lDQogIGZpbHRlciggeWVhciA9PSAyMDIwICYgKHBhcnR5ID09ICJERU1PQ1JBVCIgfCBwYXJ0eSA9PSAiUkVQVUJMSUNBTiIpICkgJT4lDQogIG11dGF0ZSggcGVyY2VudHZvdGVzID0gcm91bmQoKGNhbmRpZGF0ZXZvdGVzL3RvdGFsdm90ZXMpKjEwMCwgMikgKQ0KICANCmVsZWN0aW9uLmZpbmFsIDwtIGVsZWN0aW9uMjAyMCAlPiUNCiAgZ3JvdXBfYnkoIHN0YXRlX3BvLCBjb3VudHlfZmlwcykgJT4lDQogIHN1bW1hcmlzZSggaGlnaGVzdC52b3Rlc3BlcmNlbnQgPSBtYXgocGVyY2VudHZvdGVzLCBuYS5ybSA9IFRSVUUpICkNCg0KZWxlY3Rpb24uZmluYWwgPC0gbWVyZ2UoIGVsZWN0aW9uMjAyMCwgZWxlY3Rpb24uZmluYWwsIGJ5ID0gImNvdW50eV9maXBzIiwgYWxsLnggPSBGQUxTRSkNCg0KZWxlY3Rpb24uZmluYWwgPC0gZWxlY3Rpb24uZmluYWwgJT4lDQogIGZpbHRlciggcGVyY2VudHZvdGVzID09IGhpZ2hlc3Qudm90ZXNwZXJjZW50ICkNCg0KZGYgPC0gbWVyZ2UoZWxlY3Rpb24uZmluYWwsIGZpcHMsIGJ5LnggPSAiY291bnR5X2ZpcHMiLCBieS55ID0gImZpcHMiLCBhbGwueCA9ICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpDQoNCmRmIDwtIGRmICU+JQ0KICBtdXRhdGUoIHJlcHVibGljYW4gPSBpZmVsc2UocGFydHkgPT0gIlJFUFVCTElDQU4iLCB5ZXMgPSAxLCBubyA9IDApKSAlPiUNCiAgbXV0YXRlKHN0YXRlID0gc3RhdGVfcG8ueCwgcGFydHlfd29uID0gcGFydHkpICU+JQ0KICBzZWxlY3Qoc3RhdGUsIGNvdW50eV9maXBzLCBjb3VudHlfbmFtZSwgcGFydHlfd29uLCBjYW5kaWRhdGV2b3RlcywgdG90YWx2b3RlcywgcGVyY2VudHZvdGVzLCAgICAgICAgICByZXB1YmxpY2FuLCBsYXQsIGxvbikNCg0KZGYkY291bnR5X2ZpcHMgPC0gIGlmZWxzZSAoKGRmJGNvdW50eV9maXBzIDwgMTAwMDApLA0KICB5ZXMgPSBwYXN0ZSgwLGRmJGNvdW50eV9maXBzLCBzZXAgPSAiIiksIG5vID0gZGYkY291bnR5X2ZpcHMpDQoNCndyaXRlLmNzdihkZiwgZmlsZT0iQzovVXNlcnMvc2FnYXIvT25lRHJpdmUvRGVza3RvcC9zdGE1NTMvSE9NRVdPUktTL2RmLmNzdiIpDQpgYGANCg0KYGBge3J9DQpmaWcgPC0gcGxvdF9seSgpICAlPiUgDQogIGFkZF90cmFjZSggdHlwZSA9ICJjaG9yb3BsZXRoIiwNCiAgICAgICAgICBnZW9qc29uID0gY291bnRpZXMsDQogICAgICAgIGxvY2F0aW9ucyA9IGRmJGNvdW50eV9maXBzLA0KICAgICAgICAgICAgICAgIHogPSBkZiRwZXJjZW50dm90ZXMsDQogICAgICAgICAgIGNvbG9yc2NhbGUgPSAiVGVhbEdybiIsICAgDQogICAgICAgICAgICAgem1pbiA9IDAsDQogICAgICAgICAgICAgem1heCA9IDEwMCwNCiAgICAgICAgIHRleHQgPSB+cGFzdGUoIjxicj5Db3VudHk6ICIsIGRmJGNvdW50eV9uYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QYXJ0eSB3b246ICIsIGRmJHdpbm5lciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+V2lubmVyIHZvdGVzIHBlcmNlbnQ6ICIsIGRmJHBlcmNlbnR2b3RlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+VG90YWwgdm90ZXM6ICIsIGRmJHRvdGFsdm90ZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlN0YXRlOiAiLCBkZiRzdGF0ZV9wbyksDQoNCg0KICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsDQogICAgICAgICAgIG1hcmtlciA9IGxpc3QobGluZT1saXN0KHdpZHRoPTAuMykpKSAlPiUgDQogIGNvbG9yYmFyKHRpdGxlID0gIldpbm5lciBWb3RlcyBwZXJjZW50KCUpIikgJT4lIA0KICBsYXlvdXQoIHRpdGxlID0gbGlzdCh0ZXh0ID0gIjxiPlVTIFByZXNpZGVudGlhbCBlbGVjdGlvbnMgMjAyMCBieSBDb3VudHk8L2I+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDIwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJkYXJrcmVkIikpLA0KICAgICAgICAgIG1hcmdpbiA9IGxpc3QoIGIgPSAxNSwgbCA9IDI1LCB0ID0gODUsIHIgPSAyNSksDQogICAgICAgICAgZ2VvID0gZykNCmZpZw0KYGBgDQoNCkFuIGludGVyZXN0aW5nIHRoaW5nIHRvIG5vdGUgaXMgdGhhdCB0aGlzIHZpZXcgaXMgZXZlbiBtb3JlIGhlYXZpbHkgZG9taW5hdGVkIGJ5IHRoZSBSZXB1YmxpY2FuLiBMZXNzIGRlbnNlbHkgcG9wdWxhdGVkIGNvdW50aWVzIHRlbmQgdG8gdm90ZSByZXB1YmxpY2FuLCB3aGlsZSBoaWdoZXIgZGVuc2l0eSwgdHlwaWNhbGx5IHNtYWxsZXIgY291bnRpZXMgdGVuZCB0byB2b3RlIGZvciBkZW1vY3JhdHMuIFRoZSByZXN1bHQgaXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBvdmVyYWxsIHRoZSB3aW5uZXIgd2FzIERlbW9jcmF0IFBhcnR5Lg0KDQojIyBVc2luZyBUYWJsZWF1IHRvIGNyZWF0ZSB0aGUgbWFwDQoNCjxsaT5UaGUgbGluayBmb3IgdGhlIHZpc3VhbGl6YXRpb24gY3JlYXRlZCBpbiBUYWJsZWF1IHB1YmxpYyBpczogPGEgaHJlZj0iaHR0cHM6Ly9wdWJsaWMudGFibGVhdS5jb20vYXBwL3Byb2ZpbGUvcmFzaG1pLmthbHJhNjQxOS92aXovMjAyMEVsZWN0aW9uUG9sbHNfMTY0OTA0MTgyNjAzMDAvMjAyMFByZXNpZGVudGlhbEVsZWN0aW9uUmVzdWx0cz9wdWJsaXNoPXllcyI+Y2xpY2sgaGVyZTwvYT4gPC9saT4NCjxicj4NCg0KPGltZyBzcmM9ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmsyOTkxL3N0YTU1My9tYWluL0ltYWdlcy8yMDIwJTIwUHJlc2lkZW50aWFsJTIwRWxlY3Rpb24lMjBSZXN1bHRzLnBuZyI+IDwvaW1nPg0KDQoNCg0K